<?php
/**
 * lrn框架之文件操作
 * 本文件是lrn框架的文件操作方法集合
 * 本文件的思路参考过以下程序，在此一并致谢！
 * - xweibo{@link http://x.weibo.com}
 * - thinkphp{@link http://www.thinkphp.cn}
 * 
 * @author Horse Luke<horseluke@126.com>
 * @copyright Horse Luke, 2010
 * @license the Apache License, Version 2.0 (the "License"). {@link http://www.apache.org/licenses/LICENSE-2.0}
 * @version $Id: file.php 140 2010-11-20 14:48:08Z horseluke@126.com $
 * @package lrn_framework
 */

class lrn_file{
	
	/**
	 * 判断给定的文件名是否可写（修正在win主机下用php函数is_writable判断失误的问题）
	 * 如果文件存在并且可写则返回true，否则返回false
	 * 本函数可单独抽取使用
	 * 
	 * @param $filename 文件名
	 * @return boolen 返回结果
	 */
	public static function is_writable($filename) {
		if( !file_exists( $filename ) ){
			return false;
		}
		
		$fp = @fopen ( $filename, 'ab+' );
		if ( false == $fp ) {
			@fclose ( $fp );
			return true;
		} else {
			return false;
		}
		
	}
	
	
	/**
	 * 判断目录是否可写（也可一并检查是否可删）
	 * 本函数可单独抽取使用
	 * @param string $dirpath 目录路径，结尾不要加斜杠
	 * @param boolen $checkDEL 是否检查目录是否可删。默认为否
	 */
	public static function dir_is_writable($dirpath, $checkDEL = FALSE ) {
		$dirpath = realpath($dirpath);
		if( !is_dir( $dirpath ) ){
			return false;
		}
		
		$filename = $dirpath. DIRECTORY_SEPARATOR. 'TEST_WRITEABLE_'. time();
		$result = @file_put_contents( $filename, 'TEST_WRITEABLE', LOCK_EX );
		if( 0 === $result ){
			return false;
		}else{
			$result = @unlink( $filename );
			if( true === $checkDEL && false === $result ){
				return false;
			}else{
				return true;
			}
		}
		
	}
	
	
	/**
	 * 在win平台下，判断给出的文件名称是否大小写敏感
	 * 本函数来自thinkphp
	 * @param string $filepath 文件名所在的全路径
	 */
	public static function file_exists_case($filepath) {
		if (is_file ( $filepath )) {
			if ( strstr(PHP_OS, 'WIN') ) {
				if (basename ( realpath ( $filepath ) ) != basename ( $filepath ))
					return false;
			}
			return true;
		}
		return false;
	}
	
	
	
}